#ifndef __USART_CONFIG_H
#define __USART_CONFIG_H

#include "stm32f10x.h"
#include "freertos.h"
#include "task.h"
#include "queue.h"

#include <stdio.h>
#include <stdarg.h>
#include <string.h>  // 包含strcmp()的声明
#include <stdint.h>  // 保证uint8_t类型定义

#include "ESP01s_Control.h"
#include "LED_Init.h"

// ================= 硬件配置 =================
// USART结构体
typedef struct {
    USART_TypeDef* USARTx;    // 硬件寄存器指针
    GPIO_TypeDef* GPIOx;      // GPIO组
    uint16_t TX_Pin;          // TX引脚
    uint16_t RX_Pin;          // RX引脚  
    uint32_t BaudRate;        // 波特率
} USART_Config;

// USART对象
extern USART_Config USART1_Cfg;	
extern USART_Config USART2_Cfg;	
extern USART_Config USART3_Cfg;	

// ================= 通信协议 =================
#define MAX_STR_LEN 128								// 字符串长度
extern QueueHandle_t xQueue;						// 此处需要声明，避免重复定义

typedef enum{
    DEVICE_USART = 0,        // 串口设备
    DEVICE_LED,              // LED设备
    DEVICE_BUZZER,           // 蜂鸣器
	DEVICE_PHONE,            // 手机
    DEVICE_PHOTOSENSOR,      // 光敏传感器
}DeviceID_t;

// 消息结构体
typedef struct {
	uint8_t     data[MAX_STR_LEN]; 	// 数据载荷，特意放在最前面，防止被强行对齐出现乱码
    uint8_t     source_id;   		// 1=USART1, 2=USART2, 3=USART3
    DeviceID_t  device_id;    		// 目标设备类型
    uint16_t    len;        		// 数据长度
} USART_Message_t;

// 初始
void USART_Pin_Init(const USART_Config *cfg);
void USART_ClearRDR(const USART_Config *cfg);

// 发送
void USART_SendByte(const USART_Config *cfg, uint8_t Byte);
void USART_SendString(const USART_Config *cfg, const uint8_t *data, uint16_t len);
void USART_printf(const USART_Config *cfg, const char *format, ...);

// 接收
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void USART_NVIC_Init(const USART_Config *cfg);

#endif
